package tests;
import modelo.*;
import junit.framework.TestCase;
import utilitarios.PuntoXY;

public class PruebasEnemigo extends TestCase {

	public void testGrizzlyTankBuscaAlgoTankSinHaberParedes() {
		
		// ARRANGE
		//                                      
		//                                      JUGADOR
		// ENEMIGO                              
		Escenario escenario = new Escenario(1000, 1000);
		TanqueAlgo jugador = new TanqueAlgo(escenario, new PuntoXY(70, 45));
		TanqueGrizzly enemigo = new TanqueGrizzly(escenario, new PuntoXY(15, 15), jugador);
	
		escenario.agregarObjeto(jugador);
		escenario.agregarObjeto(enemigo);
		
		//ACT
		//El escenario simula 55 movimientos porque esa es la distancia entre los objetos (70-15=55)
		for(int i = 0; i < 55; i ++) {
			escenario.vivir();
		}
		
		//ASSERT
		assertEquals(true, enemigo.enContactoCon(jugador));
	}

	public void testGrizzlyTankBuscaAlgoTakEsquiva1ParedHaciaArriba() {
		
		//ARRANGE
		//                                      JUGADOR
		//                                      
		// ENEMIGO                              PARED
		Escenario escenario = new Escenario(1000, 1000);
		TanqueAlgo jugador = new TanqueAlgo(escenario, new PuntoXY(50, 45));
		TanqueGrizzly enemigo = new TanqueGrizzly(escenario, new PuntoXY(15, 15), jugador);
		ParedDeConcreto pared = new ParedDeConcreto(escenario, new PuntoXY(50, 15));
		
		escenario.agregarObjeto(jugador);
		escenario.agregarObjeto(enemigo);
		escenario.agregarObjeto(pared);
		
		//ACT
		for(int i = 0; i < 150; i++) {
			escenario.vivir();
		}
		
		//ASSERT
		assertEquals(true, enemigo.enContactoCon(jugador));
	}
	
	public void testSiTanqueMirageEstaALaIzquierdaDelCentroDelEscenarioDeberiaGirarADerecha() {

		// ARRANGE
		Escenario escenario = new Escenario(1000, 1000);
		TanqueAlgo tanqueAlgo = new TanqueAlgo(escenario, new PuntoXY(30, 70));
		Cuartel cuartel = new Cuartel(escenario, new PuntoXY(500, 500), tanqueAlgo);
		TanqueMirage tanqueMirage = new TanqueMirage(escenario, new PuntoXY(100, 70), cuartel);
		
		escenario.agregarObjeto(tanqueMirage);
		escenario.agregarObjeto(cuartel);

		//ACT: Se mueve segun su estrategia
		escenario.vivir();
		
		// ASSERT	
		assertEquals(102.0, tanqueMirage.getPosicion().getCoordX());
	}
	
	public void testSiTanqueMirageEstaALaDerechaDelCentroDelEscenarioDeberiaMoverseAIzquierda() {

		// ARRANGE
		Escenario escenario = new Escenario(1000, 1000);
		TanqueAlgo tanqueAlgo = new TanqueAlgo(escenario, new PuntoXY(30, 70));
		Cuartel cuartel = new Cuartel(escenario, new PuntoXY(500, 500), tanqueAlgo);
		TanqueMirage tanqueMirage = new TanqueMirage(escenario, new PuntoXY(800, 70), cuartel);
		
		escenario.agregarObjeto(tanqueMirage);
		escenario.agregarObjeto(cuartel);

		//ACT: Se mueve segun su estrategia		
		escenario.vivir();
		
		// ASSERT	
		assertEquals(798.0, tanqueMirage.getPosicion().getCoordX());
	}
	
	public void testSiTanqueMirageEstaEnElCentroDelEscenarioDeberiaMoverseArriba() {

		// ARRANGE
		Escenario escenario = new Escenario(1000, 1000);
		TanqueAlgo tanqueAlgo = new TanqueAlgo(escenario, new PuntoXY(30, 70));
		Cuartel cuartel = new Cuartel(escenario, new PuntoXY(500, 500), tanqueAlgo);
		TanqueMirage tanqueMirage = new TanqueMirage(escenario, new PuntoXY(500, 70), cuartel);
		
		escenario.agregarObjeto(tanqueMirage);
		escenario.agregarObjeto(cuartel);

		//ACT: Se mueve segun su estrategia
		escenario.vivir();
		
		// ASSERT	
		assertEquals(72.0, tanqueMirage.getPosicion().getCoordY());
	}
	
	public void testSiTanqueIFVNoEstaEnELSectorDerechoDelEscenarioDeberiaMoverseDerecha() {

		// ARRANGE
		Escenario escenario = new Escenario(1000, 1000);
		TanqueAlgo tanqueAlgo = new TanqueAlgo(escenario, new PuntoXY(30, 70));
		Cuartel cuartel = new Cuartel(escenario, new PuntoXY(500, 500), tanqueAlgo);
		TanqueIFV tanqueIFV = new TanqueIFV(escenario, new PuntoXY(100, 70), cuartel);
		
		escenario.agregarObjeto(tanqueIFV);
		escenario.agregarObjeto(cuartel);

		//ACT: Se mueve segun su estrategia
		escenario.vivir();
		
		// ASSERT	
		assertEquals(103.0, tanqueIFV.getPosicion().getCoordX());
	}
	
	public void testSiTanqueIFVEstaEnELSectorDerechoDelEscenarioYNoSeAlineoHorizontalmenteConCuartelDeberiaMoverseArriba() {

		// ARRANGE
	    //
	    //         CUARTEL
	    //                             TANQUEIFV
		Escenario escenario = new Escenario(1000, 1000);
		TanqueAlgo tanqueAlgo = new TanqueAlgo(escenario, new PuntoXY(30, 70));
		Cuartel cuartel = new Cuartel(escenario, new PuntoXY(500, 500), tanqueAlgo);
		TanqueIFV tanqueIFV = new TanqueIFV(escenario, new PuntoXY(700, 70), cuartel);
		
		escenario.agregarJugador(tanqueAlgo);
		escenario.agregarObjeto(tanqueIFV);
		escenario.agregarCuartel(cuartel);

		//ACT: Se mueve segun su estrategia		
		escenario.vivir();
		
		// ASSERT	
		assertEquals(73.0, tanqueIFV.getPosicion().getCoordY());
	}
	
	public void testSiTanqueIFVEstaEnELSectorDerechoDelEscenarioYSeAlineoHorizontalmenteConCuartelDeberiaMoverseIzquerda() {

		// ARRANGE
		Escenario escenario = new Escenario(1000, 1000);
		TanqueAlgo tanqueAlgo = new TanqueAlgo(escenario, new PuntoXY(30, 70));
		Cuartel cuartel = new Cuartel(escenario, new PuntoXY(500, 500), tanqueAlgo);
		TanqueIFV tanqueIFV = new TanqueIFV(escenario, new PuntoXY(700, 500), cuartel);
		
		escenario.agregarJugador(tanqueAlgo);
		escenario.agregarObjeto(tanqueIFV);
		escenario.agregarCuartel(cuartel);

		//ACT: Se mueve segun su estrategia
		escenario.vivir();
		
		// ASSERT	
		assertEquals(697.0, tanqueIFV.getX());
	}
	
	public void testSiTanqueGrizzlyTieneDistanciaEnYMenorADistanciaEnXconSuObjetivoSeMueveArriba() {

		// ARRANGE
		//                              CUARTEL
		//                              ALGOTANK
		// GRIZZLY
		
		Escenario escenario = new Escenario(1000, 1000);
		TanqueAlgo tanqueAlgo = new TanqueAlgo(escenario, new PuntoXY(500, 400));
		Cuartel cuartel = new Cuartel(escenario, new PuntoXY(500, 500), tanqueAlgo);
		TanqueGrizzly tanqueGrizzly = new TanqueGrizzly(escenario, new PuntoXY(100, 70), tanqueAlgo);
		
		escenario.agregarObjeto(tanqueGrizzly);
		escenario.agregarObjeto(cuartel);

		//ACT: Se mueve segun su estrategia
		escenario.vivir();
		
		// ASSERT	
		assertEquals(71.0, tanqueGrizzly.getPosicion().getCoordY());
	}
	
	public void testSiTanqueGrizzlyEstaALaDerechaDelJugadorDeberiaMoverseAIzquierda() {

		// ARRANGE
		Escenario escenario = new Escenario(1000, 1000);
		TanqueAlgo tanqueAlgo = new TanqueAlgo(escenario, new PuntoXY(500, 400));
		Cuartel cuartel = new Cuartel(escenario, new PuntoXY(500, 500), tanqueAlgo);
		TanqueGrizzly tanqueGrizzly = new TanqueGrizzly(escenario, new PuntoXY(700, 70), tanqueAlgo);
		
		escenario.agregarObjeto(tanqueGrizzly);
		escenario.agregarObjeto(cuartel);

		//ACT: Se mueve segun su estrategia		
		escenario.vivir();
		
		// ASSERT	
		assertEquals(699.0, tanqueGrizzly.getPosicion().getCoordX());
	}
	
	public void testSiTanqueGrizzlyEstaAbajoDelJugadorYAlineadoVerticalmenteConJugadorDeberiaMoverseArriba() {

		// ARRANGE
		Escenario escenario = new Escenario(1000, 1000);
		TanqueAlgo tanqueAlgo = new TanqueAlgo(escenario, new PuntoXY(500, 400));
		Cuartel cuartel = new Cuartel(escenario, new PuntoXY(500, 500), tanqueAlgo);
		TanqueGrizzly tanqueGrizzly = new TanqueGrizzly(escenario, new PuntoXY(500, 70), tanqueAlgo);
		
		escenario.agregarObjeto(tanqueGrizzly);
		escenario.agregarObjeto(cuartel);

		//ACT: Se mueve segun su estrategia		
		escenario.vivir();
		
		// ASSERT	
		assertEquals(71.0, tanqueGrizzly.getPosicion().getCoordY());
	}

	public void testSiTanqueGrizzlyEstaArribaDelJugadorYAlineadoVerticalmenteConJugadorDeberiaMoverseAbajo() {

		// ARRANGE
		Escenario escenario = new Escenario(1000, 1000);
		TanqueAlgo tanqueAlgo = new TanqueAlgo(escenario, new PuntoXY(500, 400));
		Cuartel cuartel = new Cuartel(escenario, new PuntoXY(500, 500), tanqueAlgo);
		TanqueGrizzly tanqueGrizzly = new TanqueGrizzly(escenario, new PuntoXY(500, 600), tanqueAlgo);
		
		escenario.agregarObjeto(tanqueGrizzly);
		escenario.agregarObjeto(cuartel);

		//ACT: Se mueve segun su estrategia		-
		escenario.vivir();
		
		// ASSERT	
		assertEquals(599.0, tanqueGrizzly.getPosicion().getCoordY());
	}
}
